package com.xxxx.core.persistence;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import com.xxxx.core.model.PageModel;

import java.util.List;

/**
 * 名称：DelegateMapper
 * 描述：自定义的代理Mapper，封装了常用的CRUD操作
 * 作者：vvvv
 * 时间：2018/4/12 20:35
 */
public class DelegateMapper {

    /**
     * mybatis 中的sqlSessionTemplate 对象，在 spring 配置文件中
     */
    private SqlSessionTemplate sqlSessionTemplate;

    /**
     * 构造方法
     *
     * @param sqlSessionTemplate 是 mybatis 中 sqlSessionTemplate 对象
     */
    public DelegateMapper(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    /**
     * 无参查询单个对象
     *
     * @param statement 对应 sqlMapper 模版中的单个对象查询 sql 语句的映射名
     * @return T 查询的对象
     */
    public <T> T selectOne(String statement) {
        return this.sqlSessionTemplate.selectOne(statement);
    }

    /**
     * 带参查询单个对象
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 查询单个对象所需要的参数
     * @return T 查询的对象
     */
    public <T> T selectOne(String statement, Object parameter) {
        return this.sqlSessionTemplate.selectOne(statement, parameter);
    }

    /**
     * 无参查询对象集合
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param rowBounds 查询条数的范围
     * @return List<T> 查询的对象的结果集
     */
    public <T> List<T> selectList(String statement, RowBounds rowBounds) {
        return this.sqlSessionTemplate.selectList(statement, rowBounds);
    }

    /**
     * 带参查询对象集合
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 查询所需要的参数
     * @return List<T> 查询的对象的结果集
     */
    public <T> List<T> selectList(String statement, Object parameter) {
        return this.sqlSessionTemplate.selectList(statement, parameter);
    }

    /**
     * 带参查询对象集合（并带有条数范围）
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 查询所需要的参数
     * @param rowBounds 查询条数的范围
     * @return List<T> 查询的对象的结果集
     */
    public <T> List<T> selectList(String statement, Object parameter, RowBounds rowBounds) {
        return this.sqlSessionTemplate.selectList(statement, parameter, rowBounds);
    }

    /**
     * 分页查询，返回 Page 分页对象
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param offset    分页起始数量
     * @param limit     分页限制条数
     * @return PageModel<T> 分页结果集，自定义的 PageModel 模型
     */
    public <T> PageModel<T> selectPagination(String statement, int offset, int limit) {
        Page page = PageHelper.offsetPage(offset, limit).doSelectPage(
                () -> this.sqlSessionTemplate.selectList(statement));
        return new PageModel(page);
    }

    /**
     * 分页查询，返回 Page 分页对象
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 分页查询所需的参数
     * @param offset    分页起始数量
     * @param limit     分页限制条数
     * @return PageModel<T> 分页结果集，自定义的 PageModel 模型
     */
    public <T> PageModel<T> selectPagination(String statement, Object parameter, int offset, int limit) {
        Page page = PageHelper.offsetPage(offset, limit).doSelectPage(
                () -> this.sqlSessionTemplate.selectList(statement));
        return new PageModel(page);
    }

    /**
     * 无参增加方法
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @return the int 增加成功的条数
     */
    public int insert(String statement) {
        return this.sqlSessionTemplate.insert(statement);
    }

    /**
     * 带参的增加方法
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 增加数据所需的参数
     * @return the int 增加成功的条数
     */
    public int insert(String statement, Object parameter) {
        return this.sqlSessionTemplate.insert(statement, parameter);
    }

    /**
     * 无参修改方法
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @return the int 修改成功的条数
     */
    public int update(String statement) {
        return this.sqlSessionTemplate.update(statement);
    }

    /**
     * 带参的修改方法
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 修改数据所需的参数
     * @return the int 修改成功的条数
     */
    public int update(String statement, Object parameter) {
        return this.sqlSessionTemplate.update(statement, parameter);
    }

    /**
     * 无参删除方法
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @return the int 删除成功的条数
     */
    public int delete(String statement) {
        return this.sqlSessionTemplate.delete(statement);
    }

    /**
     * 带参的删除方法
     *
     * @param statement 对应 sqlMapper 模板中的单个对象查询 sql 语句的映射名
     * @param parameter 删除数据所需的参数
     * @return the int 删除成功的条数
     */
    public int delete(String statement, Object parameter) {
        return this.sqlSessionTemplate.delete(statement, parameter);
    }
}
